package com.woniuxy.controller;

import com.woniuxy.entity.AllType;
import com.woniuxy.entity.DTO.TypeQueryDTO;
import com.woniuxy.entity.VO.TypeCountVO;
import com.woniuxy.service.ITypeService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/16 16:30
 * @Description TODO
 * 标签管理控制器
 * 处理标签相关的所有HTTP请求
 * 遵循RESTful API设计规范
 */
@RestController
@RequestMapping("/type")
public class TypeController {

    @Autowired
    private ITypeService typeService;

    /**
     * 分页多条件查询标签列表
     * 使用GET请求，参数通过查询字符串传递
     * @param queryDTO 包含查询条件和分页参数的DTO对象
     * @return 包含分页结果的响应对象
     */
    @GetMapping("/list")
    public ResponseData<PageResult<AllType>> getTypeList(TypeQueryDTO queryDTO) {
        PageResult<AllType> pageResult = typeService.getTypeList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个标签
     * 路径参数方式传递标签ID
     * @param typeId 标签ID
     * @return 包含标签信息的响应对象
     */
    @GetMapping("/{typeId}")
    public ResponseData<AllType> getTypeById(@PathVariable Integer typeId) {
        AllType type = typeService.getById(typeId);
        return ResponseData.ok(type);
    }

    /**
     * 新增标签
     * 使用POST请求，JSON格式传递标签信息
     * @param type 包含标签信息的实体对象
     * @return 操作结果响应
     */
    @PostMapping
    public ResponseData addType(@RequestBody AllType type) {
        boolean success = typeService.save(type);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增标签失败");
    }

    /**
     * 更新标签信息
     * 使用PUT请求，JSON格式传递更新信息
     * @param type 包含更新信息的实体对象
     * @return 操作结果响应
     */
    @PutMapping
    public ResponseData updateType(@RequestBody AllType type) {
        boolean success = typeService.updateById(type);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新标签失败");
    }

    /**
     * 根据ID删除单个标签
     * 使用DELETE请求，路径参数传递标签ID
     * @param typeId 标签ID
     * @return 操作结果响应
     */
    @DeleteMapping("/{typeId}")
    public ResponseData deleteType(@PathVariable Integer typeId) {
        boolean success = typeService.removeById(typeId);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除标签失败");
    }

    /**
     * 批量删除标签
     * 使用DELETE请求，请求体传递标签ID列表
     * @param typeIds 标签ID列表
     * @return 操作结果响应
     */
    @DeleteMapping("/batch")
    public ResponseData batchDeleteType(@RequestBody List<Integer> typeIds) {
        boolean success = typeService.removeByIds(typeIds);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除失败");
    }

    /**
     * 获取类型分布统计
     * @return 类型统计数据
     */
    @GetMapping("/distribution")
    public ResponseData<List<TypeCountVO>> getTypeDistribution() {
        List<TypeCountVO> distribution = typeService.getTypeDistribution();
        return ResponseData.ok(distribution);
    }
}